package domain;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Vector;

import exceptions.BenutzernameOderPasswordFalschException;
import exceptions.KundeExistiertBereitsException;
import persistence.FilepersistenceManager;
import persistence.PersistenceManager;
import valueobjects.KaufeArtikel;
import valueobjects.Kunde;


public class KundenVerwaltung {
	
	private BufferedReader in;
	
	private Vector<Kunde> kundenBestand = new Vector<Kunde>();
	private Vector<Kunde> kundenListe = new Vector();
	private Vector KunlogFile = new Vector();
	
	private PersistenceManager pm = new FilepersistenceManager(); 
	
	private static Kunde kundeBesitzer = new Kunde();
			
	private String aktKunde;
	
	public KundenVerwaltung() throws IOException{
		
		in = new BufferedReader(new InputStreamReader(System.in));
		
		liesDaten("Kunden_Liste.txt");
		
	}
	
	
	public void liesDaten(String datei) throws IOException{
		
		pm.openForReading(datei);
		
		Kunde einKunde;
		do{
			einKunde = pm.ladeKunde();
			if(einKunde!=null){
				try{
				einfuegen(einKunde);
				}catch(KundeExistiertBereitsException e){
					
				}
			}
		}while(einKunde!=null);
		pm.close();
		
	}
	
	
	public Vector<Kunde> getKunde() {
		
		return kundenBestand;
		
	}
	public String getaktKunde(){
		Kunde k = new Kunde();
		this.aktKunde = k.getBenutzername();
		return aktKunde;
	}
	
	public Kunde kundenLogin (String benutzername, String passwort) throws BenutzernameOderPasswordFalschException {
				

		kundenListe = getKunde();
		Iterator<Kunde> iter = kundenListe.iterator();
		while(iter.hasNext()){
			Kunde k = (Kunde) iter.next();
			if(k.getBenutzername().equals(benutzername)&& k.getPassword().equals(passwort)){
				setzeKunde(k);
				return k;
			}
		}
		throw new BenutzernameOderPasswordFalschException(benutzername);
		
	}

	 public boolean kundenLog() throws IOException{
         
         String benutzername = "";
         String passwort = "";
         
         System.out.println("-Kunden Login-");
         System.out.print("Benutzername : ");
         benutzername = liesEingabe();
         
         System.out.print("Passwort : ");
         passwort = liesEingabe();
         
         Iterator<Kunde> iter = kundenBestand.iterator();
         while(iter.hasNext()){
                 Kunde k = (Kunde) iter.next();
                 if(k.getBenutzername().equals(benutzername)&& k.getPassword().equals(passwort)){
                         setzeKunde(k);
                         return true;
                 }
         }
         return false;
         
 }

	
	
	public void setzeKunde(Kunde k) {

		kundeBesitzer = k;
		
	}


	public void schreibeKunde(String datei) throws IOException {
		
		pm.openForWriting(datei);

		if (!kundenBestand.isEmpty()) {
			Iterator<Kunde> iter = kundenBestand.iterator();
			while (iter.hasNext()) {
				Kunde k = (Kunde) iter.next();
				pm.speichereKunde(k);				
			}
		}				

		pm.close();
		
	}


	public void einfuegen(Kunde einKunde) throws  KundeExistiertBereitsException {
		
		if (kundenBestand.contains(einKunde)){
			throw new KundeExistiertBereitsException(einKunde, " - in 'einfuegen()' ");
		}
		kundenBestand.add(einKunde);
		
	}
	
	
	public void addKunLogFile(Vector<KaufeArtikel> warenkorb) {
		
		Iterator iter = warenkorb.iterator();
		
		while(iter.hasNext()){
			
			KaufeArtikel kArtikel = (KaufeArtikel)iter.next();
			KunlogFile.add(now("MM/dd/yy 'at' hh:mm:ss  ")+" "+kundeBesitzer.getVorname()+" "+kundeBesitzer.getNachname() +" kaufte "+ kArtikel.toString());

		}

	}
	
	
	public void schreibeKunLogFile(String string) throws IOException {
		
		pm.openForWriting(string);

		if (!KunlogFile.isEmpty()) {
			Iterator<String> iter = KunlogFile.iterator();
			while (iter.hasNext()) {
				String s = (String) iter.next();
				pm.speichereKunLogFile(s);				
			}
		}			
		pm.close();
		
	}
	
	
	public static String now(String dateFormat) {
		
	    Calendar cal = Calendar.getInstance();
	    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
	    return sdf.format(cal.getTime());
	    
	}
	
	
	protected String liesEingabe() throws IOException {
		
		return in.readLine();
		
	}
}
